/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.laporanrekapitulasipendapatan;

import java.util.List;
import java.util.Map;
import org.sadhar.sia.common.ClassConnection;

/**
 *
 * @author kris
 */
public class LaporanRekapitulasiPendapatanDAOImpl implements LaporanRekapitulasiPendapatanDAO {

    public LaporanRekapitulasiPendapatanDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    /**
     * Digunakan untuk mendapatkan tahunAnggaran dari tabel ppmk.posAnggaranPendapatanUnit
     * @return
     * @throws Exception
     */
    public List<Map> getTahunFromPosPendapatanUnit() throws Exception {
        String sql = "select DISTINCT tahunAnggaran from ppmk.posAnggaranPendapatanUnit";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        return result;
    }

    /**
     * Digunakan untuk mendapatakan nama unit kerja dari getSqlSubQuery berdasarkan tahun
     * @param tahun
     * @return
     * @throws Exception
     */
    public List<Map> getNamaUnitKerja(String tahun) throws Exception {
        /*String sql = "select DISTINCT Nama_unit_kerja from laporanRekapitulasiPendapatanView " +
        " WHERE tahunAnggaran=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        return result;*/

        String sql = "select DISTINCT Nama_unit_kerja from (" + getSqlSubQuery(tahun)
                + ")as subQuery "
                + "union select 'TOTAL PENDAPATAN';";

        //List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        return result;
    }

    /**
     * Digunakan untuk mendapatkan data pos pendapatan dari getSqlSubQuery berdasarkan tahun
     * @param tahun
     * @return
     * @throws Exception
     */
    public List<Map> getPosPendapatan(String tahun) throws Exception {
        /*String sql = "select DISTINCT posPendapatan from laporanRekapitulasiPendapatanView " +
        " WHERE tahunAnggaran=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        return result;*/

        String sql = "select DISTINCT posPendapatan from (" + getSqlSubQuery(tahun)
                + ")as subQuery ";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        return result;
    }

    public Double getHasil(String tahunAnggaran, String namaUnit, String namaPos) throws Exception {
        /* List<Map> result = ClassConnection.getJdbc().queryForList("" +
        "select Nama_unit_kerja,posPendapatan,total from laporanRekapitulasiPendapatanView where tahunAnggaran=? and" +
        " Nama_unit_kerja=? and posPendapatan=?",
        new Object[]{tahunAnggaran, namaUnit, namaPos});
        Double hasil = null;
        for (Map map : result) {
        hasil = Double.valueOf(map.get("total").toString());
        }
        return hasil;*/

        List<Map> result = ClassConnection.getJdbc().queryForList(""
                + "select Nama_unit_kerja,posPendapatan,total from (" + getSqlSubQuery(tahunAnggaran)
                + ") as subQuery "
                + " where "
                + " Nama_unit_kerja='" + namaUnit + "' and posPendapatan='" + namaPos + "'");
        Double hasil = null;
        for (Map map : result) {
            hasil = Double.valueOf(map.get("total").toString());
        }
        return hasil;
    }

    public String getSqlSubQuery(String tahunAnggaran) throws Exception {
        String sql =
                " select Nama_unit_kerja,posPendapatan, sum(prediksiJmlMhsBaru*tarif)as total from "
                + " ppmk.posAnggaranPendapatanUnit as posAnggaran inner join "
                + " ppmk.anggaranPendapatanKemahasiswaan as apk on posAnggaran.idPosAnggaranPendapatanUnit=apk.idPosAnggaranPendapatanUnit "
                + " inner join ppmk.posPendapatan as posPendapatan on posAnggaran.idPosPendapatan=posPendapatan.idPosPendapatan "
                + " inner join kamus.unkerja as un on un.Kd_unit_kerja=posAnggaran.kodeUnitKerja "
                + " where tahunAnggaran='" + tahunAnggaran + "' and namaTabelAnggaran='anggaranPendapatanKemahasiswaan' group by kodeUnitKerja "
                + " union all "
                + " select Nama_unit_kerja,posPendapatan, sum(realisasiTahunSebelumnya*(prosentase/100))as total "
                + " from ppmk.posAnggaranPendapatanUnit as posAnggaran inner join "
                + " ppmk.anggaranPendapatanLain as apk on posAnggaran.idPosAnggaranPendapatanUnit=apk.idPosAnggaranPendapatanUnit "
                + " inner join ppmk.posPendapatan as posPendapatan on posAnggaran.idPosPendapatan=posPendapatan.idPosPendapatan "
                + " inner join kamus.unkerja as un on un.Kd_unit_kerja=posAnggaran.kodeUnitKerja "
                + " where tahunAnggaran='" + tahunAnggaran + "' and namaTabelAnggaran='anggaranPendapatanLain' group by kodeUnitKerja "
                + " union all "
                + " select Nama_unit_kerja,posPendapatan, sum(jumlahFormulirYangTerjual*harga)as total from "
                + " ppmk.posAnggaranPendapatanUnit as posAnggaran inner join ppmk.posPendapatan as posPendapatan on posAnggaran.idPosPendapatan=posPendapatan.idPosPendapatan "
                + " inner join kamus.unkerja as un on un.Kd_unit_kerja=posAnggaran.kodeUnitKerja "
                + " inner join ppmk.anggaranPendapatanFormulirPMB as apfp on apfp.tahun=posAnggaran.tahunAnggaran "
                + " where tahunAnggaran='" + tahunAnggaran + "' and namaTabelAnggaran='anggaranPendapatanFormulirPMB' group by kodeUnitKerja "
                + " union all "
                + " select Nama_unit_kerja,posPendapatan, sum(prediksiJmlMhsYgUjian*tarif*(prosentase/100))as total "
                + " from ppmk.posAnggaranPendapatanUnit as posAnggaran inner join "
                + " ppmk.anggaranPendapatanUjianAkhirKKN as apk on posAnggaran.idPosAnggaranPendapatanUnit=apk.idPosAnggaranPendapatanUnit "
                + " inner join ppmk.posPendapatan as posPendapatan on posAnggaran.idPosPendapatan=posPendapatan.idPosPendapatan "
                + " inner join kamus.unkerja as un on un.Kd_unit_kerja=posAnggaran.kodeUnitKerja "
                + " where posAnggaran.tahunAnggaran='" + tahunAnggaran + "' and namaTabelAnggaran='anggaranPendapatanUjianAkhirKKN' group by kodeUnitKerja "
                + " union all "
                + " select Nama_unit_kerja,posPendapatan, sum(nominalPerBulan)as total "
                + " from ppmk.posAnggaranPendapatanUnit as posAnggaran inner join "
                + " ppmk.anggaranPendapatanBanPem as apk on posAnggaran.idPosAnggaranPendapatanUnit=apk.idPosAnggaranPendapatanUnit "
                + " inner join ppmk.posPendapatan as posPendapatan on posAnggaran.idPosPendapatan=posPendapatan.idPosPendapatan "
                + " inner join kamus.unkerja as un on un.Kd_unit_kerja=posAnggaran.kodeUnitKerja "
                + " where posAnggaran.tahunAnggaran='" + tahunAnggaran + "' and namaTabelAnggaran='anggaranPendapatanBanPem' group by kodeUnitKerja ";
        return sql;
    }
//    revisied by : sarah (BAPSI), tgl 14-12-2009

    /**
     * Digunakan untuk mendapatakan total per pos pendapatan berdasarkan tahunAnggaran dan nama pos
     * @param tahunAnggaran
     * @param namaPos
     * @return
     * @throws Exception
     */
    public Double getTotalPerPosPendapatan(String tahunAnggaran, String namaPos) throws Exception {
        List<Map> result = ClassConnection.getJdbc().queryForList(""
                + "select posPendapatan, sum(total) as total from (" + getSqlSubQuery(tahunAnggaran)
                + ") as subQuery "
                + "group by posPendapatan having posPendapatan = '" + namaPos + "' ");
        Double hasil = null;
        for (Map map : result) {
            hasil = Double.valueOf(map.get("total").toString());
        }
        return hasil;
    }

    /**
     * Digunakan untuk mendapatkan keseluruhan total berdasarkan tahunAnggaran
     * @param tahunAnggaran
     * @return
     * @throws Exception
     */
    public Double getTotalAll(String tahunAnggaran) throws Exception {
        List<Map> result = ClassConnection.getJdbc().queryForList(""
                + "select sum(total) as total from (" + getSqlSubQuery(tahunAnggaran)
                + ") as subQuery "
                + ";");
        Double hasil = null;
        for (Map map : result) {
            hasil = Double.valueOf(map.get("total").toString());
        }
        return hasil;
    }

    /**
     * Digunakan untuk melakukan pengecekan terhadap unit kerja berdasarkan tahun
     * @param tahun
     * @return
     * @throws Exception
     */
    public List<Map> CekUnitKerja(String tahun) throws Exception {
        String sql = "select DISTINCT Nama_unit_kerja from (" + getSqlSubQuery(tahun)
                + ")as subQuery "
                + ";";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        return result;
    }
}
